package com.zky.common.utils;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Iterator;

/**
 * @author noboby
 */
public class DecimalUtil {

	/**
	 * 加法计算
	 */
	public static BigDecimal add(BigDecimal...number) {
		if (number==null){ return null; }
		BigDecimal flag = new BigDecimal(0);
		Iterator<BigDecimal> it = Arrays.stream(number).iterator();
		while(it.hasNext()){
			flag = flag.add(it.next());
		}
		//for (BigDecimal b : number) { flag = flag.add(b); }
		return flag;
	}

	/**
	 * 减法计算(result = minuend - subtrahend)
	 */
	public static BigDecimal subtract(BigDecimal minuend, BigDecimal subtrahend) {
		if (minuend == null || subtrahend == null) { return null; }
		return minuend.subtract(subtrahend);
	}

	/**
	 * 乘法计算(result = x × y)
	 */
	public static BigDecimal multiply(BigDecimal x, BigDecimal y) {
		if (x == null || y == null) { return null; }
		return x.multiply(y);
	}

	/**
	 * 除法计算(result = x ÷ y)
	 * @param dividend 被除数
	 * @param divisor 除数
	 */
	public static BigDecimal division(BigDecimal dividend, BigDecimal divisor) {
		if (dividend == null || divisor == null || divisor.compareTo(BigDecimal.ZERO) == 0) { return null; }
		// 结果为0.000..时，不用科学计数法展示
		return stripTrailingZeros(dividend.divide(divisor, 20, BigDecimal.ROUND_HALF_UP));
	}

	/**
	 * 转为字符串
	 */
	public static String toString(BigDecimal x) {
		if (x == null) { return null; }
		return x.toPlainString();
	}

	/**
	 * 保留小数位数
	 * @param x     目标小数
	 * @param scale 要保留小数位数
	 */
	public static BigDecimal scale(BigDecimal x, int scale) {
		if (x == null) { return null; }
		return x.setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 整型转为BigDecimal
	 */
	public static BigDecimal toBigDecimal(Integer x) {
		if (x == null) { return null; }
		return new BigDecimal(x.toString());
	}

	/**
	 * 长整型转为BigDecimal
	 */
	public static BigDecimal toBigDecimal(Long x) {
		if (x == null) { return null; }
		return new BigDecimal(x.toString());
	}

	/**
	 * 双精度型转为BigDecimal
	 */
	public static BigDecimal toBigDecimal(Double x) {
		if (x == null) { return null; }
		return new BigDecimal(x.toString());
	}

	/**
	 * 单精度型转为BigDecimal
	 */
	public static BigDecimal toBigDecimal(Float x) {
		if (x == null) { return null; }
		return new BigDecimal(x.toString());
	}

	/**
	 * 字符串型转为BigDecimal
	 */
	public static BigDecimal toBigDecimal(String x) {
		if (x == null) { return null; }
		return new BigDecimal(x);
	}

	/**
	 * 对象类型转为BigDecimal
	 */
	public static BigDecimal toBigDecimal(Object x) {
		if (x == null) { return null; }
		BigDecimal result = null;
		try {
			result = new BigDecimal(x.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 倍数计算，用于单位换算
	 * @param x        目标数(可为null)
	 * @param multiple 倍数 (可为null)
	 */
	public static BigDecimal multiple(BigDecimal x, Integer multiple) {
		if (x == null || multiple == null) { return null; }
		return DecimalUtil.multiply(x, toBigDecimal(multiple));
	}

	/**
	 * 去除小数点后的0（如: 输入1.000返回1）
	 */
	public static BigDecimal stripTrailingZeros(BigDecimal x) {
		if (x == null) { return null; }
		return x.stripTrailingZeros();
	}
}
